﻿namespace Letter.Net.Kcp.Library.FEC;

interface CodingLoop
{
    /**
* Multiplies a subset of rows from a coding matrix by a full set of
* input shards to produce some output shards.
*
* @param matrixRows The rows from the matrix to use.
* @param inputs An array of byte arrays, each of which is one input shard.
*               The inputs array may have extra buffers after the ones
*               that are used.  They will be ignored.  The number of
*               inputs used is determined by the length of the
*               each matrix row.
* @param inputCount The number of input byte arrays.
* @param outputs Byte arrays where the computed shards are stored.  The
*                outputs array may also have extra, unused, elements
*                at the end.  The number of outputs computed, and the
*                number of matrix rows used, is determined by
*                outputCount.
* @param outputCount The number of outputs to compute.
* @param offset The index in the inputs and output of the first byte
*               to process.
* @param byteCount The number of bytes to process.
*/
    void codeSomeShards(byte[][] matrixRows,
        byte[][] inputs,
        int inputCount,
        byte[][] outputs,
        int outputCount,
        int offset,
        int byteCount);

    /**
     * Multiplies a subset of rows from a coding matrix by a full set of
     * input shards to produce some output shards, and checks that the
     * the data is those shards matches what's expected.
     *
     * @param matrixRows The rows from the matrix to use.
     * @param inputs An array of byte arrays, each of which is one input shard.
     *               The inputs array may have extra buffers after the ones
     *               that are used.  They will be ignored.  The number of
     *               inputs used is determined by the length of the
     *               each matrix row.
     * @param inputCount THe number of input byte arrays.
     * @param toCheck Byte arrays where the computed shards are stored.  The
     *                outputs array may also have extra, unused, elements
     *                at the end.  The number of outputs computed, and the
     *                number of matrix rows used, is determined by
     *                outputCount.
     * @param checkCount The number of outputs to compute.
     * @param offset The index in the inputs and output of the first byte
     *               to process.
     * @param byteCount The number of bytes to process.
     * @param tempBuffer A place to store temporary results.  May be null.
     */
    bool checkSomeShards(byte[][] matrixRows,
        byte[][] inputs,
        int inputCount,
        byte[][] toCheck,
        int checkCount,
        int offset,
        int byteCount,
        byte[] tempBuffer);
}